<script>
import { user } from '@/utils/api/index.js'
export default {
    onLaunch: function () {
        console.log('App Launch')
        // 初始化加载所有字典数据和地块数据
        this.initDictData()
        this.initParcelData()
        // 初始化用户信息
        this.initUserInfo()
        // 启动token刷新检查
        this.startTokenRefresh()
    },
    onShow: function () {
        console.log('App Show')
    },
    onHide: function () {
        console.log('App Hide')
        // 清除定时器
        if (this.refreshTimer) {
            clearInterval(this.refreshTimer)
        }
    },
    methods: {
        // 初始化加载字典数据
        async initDictData() {
            try {
                // 调用store中的action加载所有字典数据
                await this.$store.dispatch('getAllDictTypes')
                console.log('字典数据加载成功')
            } catch (error) {
                console.error('字典数据加载失败:', error)
            }
        },
        // 初始化加载地块数据
        async initParcelData() {
            try {
                await this.$store.dispatch('fetchParcelData')
                console.log('地块数据加载成功')
            } catch (error) {
                console.error('地块数据加载失败:', error)
            }
        },
        // 初始化用户信息
        async initUserInfo() {
            try {
                await this.$store.dispatch('fetchUserInfo')
                console.log('用户信息加载成功')
            } catch (error) {
                console.error('用户信息加载失败:', error)
            }
        },

        // 启动token刷新检查
        startTokenRefresh() {
            // 每5分钟检查一次token
            this.refreshTimer = setInterval(() => {
                this.checkAndRefreshToken()
            }, 5 * 60 * 1000)

            // 初次检查
            this.checkAndRefreshToken()
        },

        // 检查并刷新token
        async checkAndRefreshToken() {
            try {
                const token = uni.getStorageSync('token')
                const refreshToken = uni.getStorageSync('refreshToken')
                const expiresTime = uni.getStorageSync('expiresTime')

                if (!token || !refreshToken) {
                    return
                }

                // 使用存储的过期时间
                const expiresIn = new Date(Number(expiresTime)).getTime()
                const now = Date.now()

                // 如果token将在15分钟内过期,则刷新
                if (expiresIn - now < 15 * 60 * 1000) {
                    const res = await user.refreshToken(refreshToken)

                    if (res.code === 0 && res.data) {
                        // 更新存储的token和相关信息
                        uni.setStorageSync('token', res.data.accessToken)
                        uni.setStorageSync('refreshToken', res.data.refreshToken)
                        uni.setStorageSync('userId', res.data.userId)
                        uni.setStorageSync('expiresTime', res.data.expiresTime)
                        console.log(
                            'Token刷新成功，有效期至:',
                            new Date(res.data.expiresTime).toLocaleString()
                        )
                    } else {
                        console.error('Token刷新失败:', res.msg)
                        // token刷新失败,可能需要重新登录
                        this.clearLoginInfo()
                        uni.reLaunch({
                            url: '/pages/login/login',
                        })
                    }
                }
            } catch (error) {
                console.error('Token刷新出错:', error)
                // 发生错误时清除token并跳转登录页
                this.clearLoginInfo()
                uni.reLaunch({
                    url: '/pages/login/login',
                })
            }
        },

        // 清除登录信息
        clearLoginInfo() {
            uni.removeStorageSync('token')
            uni.removeStorageSync('refreshToken')
            uni.removeStorageSync('userId')
            uni.removeStorageSync('expiresTime')
        },
    },
}
</script>

<style lang="scss">
/*每个页面公共css */
@import './common/common.scss';
</style>
